/**
 * 动画视图组件
 * 
 * 职责：
 * 1. 缓存动画组件（Animation）
 * 2. 提供动画控制的便捷方法
 * 
 * 适用场景：
 * - 需要动画的实体（角色、特效等）
 * 
 * 内存占用：~48 bytes
 * - 基类: ~40 bytes
 * - _animation: 8 bytes
 * 
 * @author AI Assistant
 * @date 2025-11-29
 */

import { ecs } from "../../../../core/ecs/ECS";
import { Animation, AnimationClip } from "cc";
import { ViewComponentBase } from "./ViewComponentBase";

/**
 * 动画视图组件
 */
@ecs.register('ViewAnimation', false)
export class ViewComponentAnimation extends ViewComponentBase {
    // ========== 懒加载缓存 ==========
    
    /** Animation 组件（动画播放）- 懒加载 */
    private _animation: Animation | null | undefined = undefined;
    
    // ========== 懒加载 Getter ==========
    
    /**
     * 获取 Animation 组件（懒加载）
     */
    get animation(): Animation | null {
        if (this._animation === undefined) {
            this._animation = this.node?.getComponent(Animation) || null;
        }
        return this._animation;
    }
    
    /**
     * 重置组件
     */
    reset(): void {
        super.reset();
        this._animation = undefined;
    }
    
    // ========== 便捷方法 ==========
    
    /**
     * 播放动画
     * @param animName 动画名称
     * @param loop 是否循环（默认 false）
     */
    playAnimation(animName: string, loop: boolean = false): void {
        if (!this.animation) {
            console.warn('[ViewComponentAnimation] 没有 Animation 组件');
            return;
        }
        
        const animState = this.animation.getState(animName);
        if (animState) {
            // 设置循环模式
            if (loop) {
                animState.wrapMode = 2; // Loop
            } else {
                animState.wrapMode = 1; // Normal
            }
            this.animation.play(animName);
        } else {
            console.warn(`[ViewComponentAnimation] 动画 "${animName}" 不存在`);
        }
    }
    
    /**
     * 停止动画
     */
    stopAnimation(): void {
        if (this.animation) {
            this.animation.stop();
        }
    }
    
    /**
     * 暂停动画
     */
    pauseAnimation(): void {
        if (this.animation) {
            this.animation.pause();
        }
    }
    
    /**
     * 恢复动画
     */
    resumeAnimation(): void {
        if (this.animation) {
            this.animation.resume();
        }
    }
    
    /**
     * 播放指定动画（带回调）
     */
    playAnimationWithCallback(
        animName: string, 
        onFinished?: () => void,
        loop: boolean = false
    ): void {
        if (!this.animation) return;
        
        this.playAnimation(animName, loop);
        
        if (onFinished && !loop) {
            const animState = this.animation.getState(animName);
            if (animState) {
                // 计算动画时长
                const duration = animState.duration;
                setTimeout(() => {
                    onFinished();
                }, duration * 1000);
            }
        }
    }
    
    /**
     * 检查动画是否正在播放
     */
    isPlaying(animName?: string): boolean {
        if (!this.animation) return false;
        
        if (animName) {
            const state = this.animation.getState(animName);
            return state ? state.isPlaying : false;
        }
        
        return this.animation.getState()?.isPlaying || false;
    }
    
    /**
     * 获取所有动画名称
     */
    getAnimationNames(): string[] {
        if (!this.animation) return [];
        
        const clips = this.animation.clips;
        return clips.map(clip => clip.name);
    }
    
    /**
     * 检查是否有动画组件
     */
    hasAnimationComponent(): boolean {
        return this.animation !== null;
    }
}

